package me.hl.concurrent;

import java.util.concurrent.*;

/**
 * 将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。
 * 使用者 take 已完成的任务，并按照完成这些任务的顺序处理它们的结果。
 * 例如，CompletionService 可以用来管理异步 IO ，执行读操作的任务作为程序或系统的一部分提交，
 * 然后，当完成读操作时，会在程序的不同部分执行其他操作，执行操作的顺序可能与所请求的顺序不同。
 * 通常，CompletionService 依赖于一个单独的 Executor 来实际执行任务，在这种情况下，
 * CompletionService 只管理一个内部完成队列。ExecutorCompletionService 类提供了此方法的一个实现。
 * Created by Planck on 2016/1/29.
 */
public class CompletionServiceTest implements Callable<String> {
    private int num;

    public CompletionServiceTest(int num) {
        this.num = num;
    }


    public static void main(String args[]) throws Exception {
        ExecutorService service = Executors.newCachedThreadPool();
        CompletionService<String> completionService = new ExecutorCompletionService<>(service);
        for (int i = 0; i < 10; i++) {
            System.out.println("加入" + i);
            //这里也可以获得结果
            completionService.submit(new CompletionServiceTest(i));
        }
        for (int i = 0; i < 10; i++) {
            System.out.println("得到结果" + completionService.take().get());
        }


    }

    @Override
    public String call() throws Exception {
        return String.valueOf(num);
    }
}
